#ifndef BATT_BANK_H
#define BATT_BANK_H

#include <QtCore>

#include "ComDefine.h"
#include "BmuParam.h"
#include "AlarmParam.h"

//前置声明
class CBattStack;
// 电池组数据
// 一组电池组数据
class CBattBank
{
public:
    //获取英文名称(主要供调试用)
    QString GetNameOfBankState();
    //获取电池组状态的中文utf8(主要供界面显示)
    QString GetUtf8OfBankState();

    //是不是禁止状态
    bool IsForbidOfBankState();
    //是不是禁充状态
    bool IsForbidChargeOfBankState();
    //是不是禁放状态
    bool IsForbidDischargeOfBankState();
    //是不是告警状态
    bool IsAlarmOfBankState();
    //是不是故障状态
    bool IsFaultOfBankState();
    //是不是正常状态
    bool IsNormalOfBankState();
    //是不是预警状态
    bool IsWarnOfBankState();

    //获取Bmu数量
    quint16 GetBmuCount();    

    //获取支路状态的中文utf8(主要供界面显示)
    QString GetUtf8OfBranState();

    //计算PACK箱内的单体数量
    void CalcSglNumInPack();
    //计算PACK箱内的温度数量
    void CalcTempNumInPack();

    //计算组簇功率
    void CalcBankPower();

    //初始化为默认值
    void InitToDefault();

    //初始化单体数据为无效
    void InitSglDataToInvalid();
    //初始化动力线数据为无效
    void InitPwLnDataToInvalid();

    //初始化干节点6和7
    void InitDry6And7(CBattStack* pStack);

    //初始化故障灯
    void InitFaultLamp(int iStackCtrlDoNo);
    //初始化运行灯
    void InitRunLamp(int iStackCtrlDoNo);

    //初始化降功率信息
    void InitDropPowerInfo(CBattStack* pStack);

    //是否对时成功(true成功,false失败)
    bool IsCheckTimeOk();

    //计算can通讯帧数
    void CalcCanFrameNum(quint16 usPackPowerLineStrategy);
	
	bool IsBankVolValid();
    bool IsBankVolInvalid();
    bool IsBankCurValid();
    bool IsBankCurInvalid();
    bool IsBankSocValid();
    bool IsBankSocInvalid();

    bool IsBranVolValid();
    bool IsBranVolInvalid();
    bool IsBranCurValid();
    bool IsBranCurInvalid();
    bool IsBranSocValid();
    bool IsBranSocInvalid();

    bool IsPackVolValid(int iPackIndex);
    bool IsPackVolInvalid(int iPackIndex);

    bool IsSglVolValid(int iSglIndex);
    bool IsSglVolInvalid(int iSglIndex);
    bool IsSglTempValid(int iSglIndex);
    bool IsSglTempInvalid(int iSglIndex);
    bool IsSglSocValid(int iSglIndex);
    bool IsSglSocInvalid(int iSglIndex);
    bool IsSglSohValid(int iSglIndex);
    bool IsSglSohInvalid(int iSglIndex);
	
    void SetTimeBranChgDropPower(const QDateTime& dt);
    void SetTimeBranDchgDropPower(const QDateTime& dt);
    void SetTimeStart(const QDateTime& dt);
    void SetTimeSave(const QDateTime& dt);
    void SetTimeStateChangeStart(const QDateTime& dt);
    void SetTimeLastBankState(const QDateTime& dt);
    void SetTimeBCMUConnFaultStart(const QDateTime& dt);
    void SetTimeBMUConnFaultStart(const QDateTime& dt);
    void SetTimeConfirm(const QDateTime& dt);
    void SetTimeDropPowerAlarm(const QDateTime& dt);

public:
    uchar uaModbusAddr;              // Modbus 地址
    uchar uaModbusAddrBg;            // Modbus 地址 对应转发的地址

    // 输入寄存器
    quint16 usBankState;             // 电池组状态                     1      0x1111禁充 0x2222禁放 0x5555告警 0xAAAA故障 0xBBBB正常
    quint16	usBankChgDchgState; 	 // 电池组充放电状态	           2      1 - 开路 2 - 待机 3 - 充电  4 - 放电
    quint16 usCellNumInBank;         // 电池组管辖电池节数             3
    quint16 usTempNumInBank;         // 电池组管辖温度节数             4
    quint16 usPackNumInBank;         // 电池组管辖PACK数               5
    quint16	usChgNum; 	             // 电池组充电次数		           6
    quint16	usDchgNum; 	             // 电池组放电次数		           7
    quint16	usSglMaxVolNo;           // 单体电压最大节号               8
    quint16	usSglMinVolNo;           // 单体电压最小节号               9
    quint16	usSglMaxTempNo;          // 单体温度最大节号               10
    quint16	usSglMinTempNo;          // 单体温度最小节号               11
    quint16	usSglMaxResNo;           // 单体内阻最大节号               12
    quint16	usSglMinResNo;           // 单体内阻最小节号               13
    quint16	usSglMaxSocNo;           // 单体SOC最大节号                14
    quint16	usSglMinSocNo;           // 单体SOC最小节号                15
    quint16	usSglMaxSohNo;           // 单体SOH最大节号                16
    quint16	usSglMinSohNo;           // 单体SOH最小节号                17
    quint16	usDI1;				     // 开关量输入-DI1		           18     1--闭合， 0--断开
    quint16	usDI2; 	                 // 开关量输入-DI2                 19
    quint16	usDI3; 	                 // 开关量输入-DI3                 20
    quint16	usDI4; 	                 // 开关量输入-DI4		           21
    quint16	usDI5; 	                 // 开关量输入-DI5		           22
    quint16	usDI6; 	                 // 开关量输入-DI6		           23
    quint16 usBankTemp[29];          // 24 - 50(多2)

    quint16	usModuleMaxVolNo;        // 模块电压最大节号
    quint16	usModuleMinVolNo;        // 模块电压最小节号

    float fBankVol; 	             // 组端电压		               51
    float fBankCur; 	             // 组电流		                   53
    float fBankPower;                // 组功率
    float fBankInsuRes;              // 组绝缘
    float fBankSoc;                  // 组SOC		                   55
    float fBankSoh;                  // 组SOH	                       57
    float fEnvTemp; 	             // 环境温度		               59
    float fPosRes; 	                 // 正极绝缘电阻	               61
    float fNegRes;                   // 负极绝缘电阻	               63
    float fBankChargeEQ; 	         // 电池组可充电量                 65
    float fBankDischargeEQ; 	     // 电池组可放电量	               67
    float fBankSglChargeEQ;     	 // 电池组单次充电电量             69
    float fBankSglDischargeEQ; 	     // 电池组单次放电电量             71
    double dblBankChargeEQAdd; 	     // 电池组累计充电电量	           73
    double dblBankDischargeEQAdd;    // 电池组累计放电电量	           75
    float fBankSglChargeAh;     	 // 电池组单次充电容量
    float fBankSglDischargeAh; 	     // 电池组单次放电容量
    double dblBankChargeAhAdd; 	     // 电池组累计充电容量
    double dblBankDischargeAhAdd;    // 电池组累计放电容量
    float fSglVolDiffInBank;         // 组单体电压压差极差值           77
    float fSglAvgVol;                // 单体电压平均值                 79
    float fSglMaxVol;                // 单电电压最大值                 81
    float fSglMinVol; 	             // 单电电压最小值	               83
    float fSglTempDiffInBank;        // 组单体温度温差极差值           85
    float fSglAvgTemp; 	             // 单体温度平均值                 87
    float fSglMaxTemp;               // 单电温度最大值	               89
    float fSglMinTemp;               // 单电温度最小值	               91
    float fSglAvgRes;                // 单体平均内阻	               93
    float fSglMaxRes;                // 单体内阻最大值	               95
    float fSglMinRes;                // 单体内阻最小值		           97
    float fSglAvgSoc; 	             // 单体SOC平均值                  99
    float fSglMaxSoc;                // 单体SOC最大值		           101
    float fSglMinSoc;                // 单体SOC最小值	               103
    float fSglAvgSoh;                // 单体SOH平均值                  105
    float fSglMaxSoh;                // 单体SOH最大值	               107
    float fSglMinSoh;                // 单体SOH最小值	               109
    float fBankAllowMaxChargePower;       // 电池组最大充电功率             111
    float fBankAllowMaxDischargePower;    // 电池组最大放电功率             113
    float fBankAllowMaxChargeCurrent;     // 电池组最大充电电流             115
    float fBankAllowMaxDischargeCurrent;  // 电池组最大放电电流             117
    float fEnvTemp2; 	             // 环境温度		               119
    float fEnvTemp3; 	             // 环境温度		               121
    float fEnvTemp4; 	             // 环境温度	                   123
    float fHvPwlTemp[4]; 	         // 高压极柱温度
    float fBankTemp[41];             // 125 - 200

    float fModuleVolDiffInBank;     // 组模块电压极差值
    float fModuleMaxVol;            // 模块电压最大值
    float fModuleMinVol;            // 模块电压最小值

    // 单体数据                           400Cell     600Cell
    float fSglVol[MAX_BATT_NUM];     // 单体电压                       201  ~ 1000   201  ~ 1400
    float fSglTemp[MAX_BATT_NUM];    // 单体温度                       1001 ~ 1800   1401 ~ 2600
    float fSglSoc[MAX_BATT_NUM];     // 单体Soc                        1801 ~ 2600   2601 ~ 3800
    float fSglRes[MAX_BATT_NUM];     // 单体内阻                       2601 ~ 3400   3801 ~ 5000
    float fSglSoh[MAX_BATT_NUM];     // 单体Soh                        3401 ~ 4200   5001 ~ 6200
    quint16 usPwLnTempType;             //动力线温度类型:0未设置,1设置动力线总数量,2设置箱内动力线温度数(总数=PACK数*箱内动力线温度数)
    quint16 usPwLnTempNumInPack;        //单个PACK箱内的动力线温度数量,值>=0且<=50
    quint16 usPwLnTempNumInBank;        //单个电池组中所有的动力线温度数,值>=0且<=MAX_PACK_PWR_LN_TEMP_NUM
    float fPwLnTemp[MAX_PACK_PWR_LN_TEMP_NUM]; // 动力线温度           4201 ~ 4400   6201 ~ 6400
    float fPackVol[MAX_PACK_NUM];    // 箱电压                         4401 ~ 4499

    // 支路信息
    quint16 usBranState;                 // 支路运行状态                        8001           0x1111禁充 0x2222禁放 0x5555告警 0xAAAA故障 0xBBBB正常
    quint16 usMaxBankSocNoInBran;        // 支路内组SOC最高组号                 8002
    quint16 usMinBankSocNoInBran;        // 支路内组SOC最低组号                 8003
    quint16 usMaxBankVolNoInBran;        // 支路内组电压最高组号                8004
    quint16 usMinBankVolNoInBran;        // 支路内组电压最低组号                8005
    quint16 usSglMaxVolBankNoInBran;     // 支路内最高单体电压电池组号          8006
    quint16 usSglMaxVolNoInBankInBran;   // 支路内最高单体电压所在组的组内编号  8007
    quint16 usSglMinVolBankNoInBran;     // 支路内最低单体电压电池组号          8008
    quint16 usSglMinVolNoInBankInBran;   // 支路内最低单体电压所在组的组内编号  8009
    quint16 usSglMaxTempBankNoInBran;    // 支路内最高单体温度电池组号          8010
    quint16 usSglMaxTempNoInBankInBran;  // 支路内最高单体温度所在组的组内编号  8011
    quint16 usSglMinTempBankNoInBran;    // 支路内最低单体温度电池组号          8012
    quint16 usSglMinTempNoInBankInBran;  // 支路内最低单体温度所在组的组内编号  8013
    quint16 usBranTemp[40];              // 8014 - 8050

    float fBranVol;                      // 支路电压                            8051
    float fBranCur; 	                 // 支路电流                            8053
    float fBranPower;                    // 支路功率
    float fBranInsuRes;                  // 支路绝缘
    float fBranSoc;                      // 支路SOC                             8055
    float fBranSoh; 	                 // 支路SOH                             8057
    float fBranChargeEQ; 	             // 支路可充电量                        8059
    float fBranDischargeEQ;              // 支路可放电量                        8061
    float fBranSglChargeEQ;              // 支路单次充电电量                    8063
    float fBranSglDischargeEQ;           // 支路单次放电电量                    8065
    double dblBranChargeEQAdd;           // 支路充电量累加值                    8067
    double dblBranDischargeEQAdd; 	     // 支路放电量累加值                    8069
    float fBranSglChargeAh;              // 支路单次充电容量
    float fBranSglDischargeAh;           // 支路单次放电容量
    double dblBranChargeAhAdd;           // 支路充容量累加值
    double dblBranDischargeAhAdd; 	     // 支路放容量累加值
    float fSglVolDiffInBran;             // 单体电压压差极差值	                8071
    float fSglMaxVolInBran;              // 最高单体电压   		                8073
    float fSglMinVolInBran;              // 最低单体电压                        8075
    float fSglTempDiffInBran;            // 电池温度温差极差值	                8077
    float fSglMaxTempInBran;             // 最高电池温度                        8079
    float fSglMinTempInBran;             // 最低电池温度                        8081
    float fBankSocDiffInBran;            // 组SOC差极差值	                    8083
    float fBankSocMaxInBran;             // 组SOC最大                           8085
    float fBankSocMinInBran;             // 组SOC最小                           8087
    float fBankVolDiffInBran;            // 组电压差极差值	                    8089
    float fBankVolMaxInBran;             // 组电压最大                          8091
    float fBankVolMinInBran;             // 组电压最小                          8093
    float fBranAllowMaxChargePower;      // 支路当前允许最大充电功率            8095
    float fBranAllowMaxDischargePower;   // 支路当前允许最大放电功率            8097
    float fBranAllowMaxChargeCurrent;    // 支路当前允许最大充电电流            8099
    float fBranAllowMaxDischargeCurrent; // 支路当前允许最大放电电流            8101
    float fBranTemp[49];                 // 8103 - 8200

    // 离散输入寄存器
    char aBankVolUpLimitWarn;	     // 组电压上限预警                 1
    char aBankVolDownLimitWarn;      // 组电压下限预警                 2
    char aChgCurUpLimitWarn;		 // 充电电流上限预警               3
    char aDchgCurUpLimitWarn;		 // 放电电流上限预警               4
    char aSglVolUpLimitWarn;	     // 单体电压上限预警	           5
    char aSglVolDownLimitWarn;	     // 单体电压下限预警	           6
    char aChgTempUpLimitWarn;	     // 充电温度上限预警	           7
    char aChgTempDownLimitWarn;	     // 充电温度下限预警               8
    char aDchgTempUpLimitWarn;	     // 放电温度上限预警	           9
    char aDchgTempDownLimitWarn;	 // 放电温度下限预警               10
    char aSglTempUpLimitWarn;	     // 单体温度上限预警	           11
    char aSglTempDownLimitWarn;	     // 单体温度下限预警               12
    char aEnvTempUpLimitWarn;		 // 环境温度上限预警	           13
    char aEnvTempDownLimitWarn;	     // 环境温度下限预警	           14
    char aPowerLineTempUpLimitWarn;	 // 动力线温度上限预警	           15
    char aBankSocUpLimitWarn;	     // SOC超上限预警		           16
    char aBankSocDownLimitWarn;	     // SOC超下限预警		           17
    char aPosResDownLimitWarn;		 // 正极绝缘内阻下限预警           18
    char aNegResDownLimitWarn;		 // 负极绝缘内阻下限预警           19
    char aPackVolDiffUpLimitWarn;	 // 箱压差上限预警                 20
    char aPackTempDiffUpLimitWarn;	 // 箱温差上限预警                 21

    char aBankVolUpLimitAlarm;	     // 组电压上限告警                 22
    char aBankVolDownLimitAlarm;     // 组电压下限告警                 23
    char aChgCurUpLimitAlarm;		 // 充电电流上限告警               24
    char aDchgCurUpLimitAlarm;		 // 放电电流上限告警               25
    char aSglVolUpLimitAlarm;	     // 单体电压上限告警	           26
    char aSglVolDownLimitAlarm;	     // 单体电压下限告警	           27
    char aChgTempUpLimitAlarm;	     // 充电温度上限告警	           28
    char aChgTempDownLimitAlarm;	 // 充电温度下限告警               29
    char aDchgTempUpLimitAlarm;	     // 放电温度上限告警	           30
    char aDchgTempDownLimitAlarm;	 // 放电温度下限告警               31
    char aSglTempUpLimitAlarm;	     // 单体温度上限告警	           32
    char aSglTempDownLimitAlarm;	 // 单体温度下限告警               33
    char aEnvTempUpLimitAlarm;		 // 环境温度上限告警	           34
    char aEnvTempDownLimitAlarm;	 // 环境温度下限告警	           35
    char aPowerLineTempUpLimitAlarm; // 动力线温度上限告警	           36
    char aBankSocUpLimitAlarm;	     // SOC超上限告警		           37
    char aBankSocDownLimitAlarm;	 // SOC超下限告警		           38
    char aPosResDownLimitAlarm;		 // 正极绝缘内阻下限告警           39
    char aNegResDownLimitAlarm;		 // 负极绝缘内阻下限告警           40
    char aPackVolDiffUpLimitAlarm;	 // 箱压差上限告警                 41
    char aPackTempDiffUpLimitAlarm;	 // 箱温差上限告警                 42

    char aBankVolUpLimitProt;	     // 组电压上限保护                 43
    char aBankVolDownLimitProt;      // 组电压下限保护                 44
    char aChgCurUpLimitProt;		 // 充电电流上限保护               45
    char aDchgCurUpLimitProt;		 // 放电电流上限保护               46
    char aSglVolUpLimitProt;	     // 单体电压上限保护	           47
    char aSglVolDownLimitProt;	     // 单体电压下限保护	           48
    char aChgTempUpLimitProt;	     // 充电温度上限保护	           49
    char aChgTempDownLimitProt;	     // 充电温度下限保护               50
    char aDchgTempUpLimitProt;	     // 放电温度上限保护	           51
    char aDchgTempDownLimitProt;	 // 放电温度下限保护               52
    char aSglTempUpLimitProt;	     // 单体温度上限保护	           53
    char aSglTempDownLimitProt;	     // 单体温度下限保护               54
    char aEnvTempUpLimitProt;		 // 环境温度上限保护	           55
    char aEnvTempDownLimitProt;	     // 环境温度下限保护	           56
    char aPowerLineTempUpLimitProt;	 // 动力线温度上限保护	           57
    char aBankSocUpLimitProt;	     // SOC超上限保护		           58
    char aBankSocDownLimitProt;	     // SOC超下限保护		           59
    char aPosResDownLimitProt;		 // 正极绝缘内阻下限保护           60
    char aNegResDownLimitProt;		 // 负极绝缘内阻下限保护           61
    char aPackVolDiffUpLimitProt;	 // 箱压差上限保护                 62
    char aPackTempDiffUpLimitProt;	 // 箱温差上限保护                 63

    char aSglTempRise;	             // 电池温度温升过快               64
    char aPowerLineTempRise;	     // 动力线温度温升过快             65
    char aBMUConnFault;		         // BMU通讯故障	                   66
    char aBCMUConnFault;		     // BCMU通讯故障                   67
    char aSglVolWireFault;           // 单体电压采集线故障             68
    char aBankVolWireFault;          // 总压采集线故障                 69
    char aCurWireFault;              // 电流采集线故障                 70
    char aTempWireBreak;             // 温度采集断线                   71
    char aTempShortCircuit;          // 温度采集短路                   72
    char aBMSFault;                  // BMS设备故障                    73
    char aSglVolInvalid;             // 单体电压无效                   74
    char aSglTempInvalid;            // 单体温度无效                   75
    char aBankVolInvalid;            // 组端电压无效                   76
    char aBankCurAbnormity;          // 组电流异常                     77
    char aPosJCQAdheFault;           // 总正接触器粘连故障             78
    char aNegJCQAdheFault;           // 总负接触器粘连故障             79
    char aPreJCQAdheFault;           // 预充接触器粘连故障             80
    char aPosJCQNotCloseFault;       // 总正接触器不闭合故障           81
    char aNegJCQNotCloseFault;       // 总负接触器不闭合故障           82
    char aPreJCQNotCloseFault;       // 预充接触器不闭合故障           83
    char aHallComFault;              // 霍尔通讯故障                   84
    char aHallDacFault;              // 霍尔采集故障                   85
    char aPosFuseBreakFault;         // 正极熔断器断开故障             86
    char aNegFuseBreakFault;         // 负极熔断器断开故障             87
    char aBankVolDiffFault;          // 组压采集差故障                 88
    char aPackVolUpLimitWarn;	     // 箱电压上限预警                 89
    char aPackVolDownLimitWarn;      // 箱电压下限预警                 90
    char aPackVolUpLimitAlarm;	     // 箱电压上限告警                 91
    char aPackVolDownLimitAlarm;     // 箱电压下限告警                 92
    char aPackVolUpLimitProt;	     // 箱电压上限保护                 93
    char aPackVolDownLimitProt;      // 箱电压下限保护                 94
    char aCellVolDiffUpLimitWarn;    // 组内单体电压极差上限预警       95
    char aCellVolDiffUpLimitAlarm;   // 组内单体电压极差上限告警       96
    char aCellVolDiffUpLimitProt;    // 组内单体电压极差上限保护       97
    char aCellTempDiffUpLimitWarn;   // 组内单体温度极差上限预警       98
    char aCellTempDiffUpLimitAlarm;  // 组内单体温度极差上限告警       99
    char aCellTempDiffUpLimitProt;   // 组内单体温度极差上限保护       100
    char aModuleVolDiffUpLimitWarn;  // 组内模块电压极差上限预警       101
    char aModuleVolDiffUpLimitAlarm; // 组内模块电压极差上限告警       102
    char aModuleVolDiffUpLimitProt;  // 组内模块电压极差上限保护       103
    char aHvPwLnTempUpLimitWarn;     // 高压动力线温度上限预警         104
    char aHvPwLnTempUpLimitAlarm;    // 高压动力线温度上限告警         105
    char aHvPwLnTempUpLimitProt;     // 高压动力线温度上限保护         106
    char aBankCurAbnormalWarn;       // 组电流异常预警                 107
    char aBankCurAbnormalAlarm;      // 组电流异常告警                 108
    char aBankCurAbnormalProt;       // 组电流异常保护                 109
    char aCellVolSudChgWarn;         // 电压突变预警                   110
    char aCellVolSudChgAlarm;        // 电压突变告警                   111
    char aCellVolSudChgProt;         // 电压突变保护                   112
    char aCellInResAbnormal;         // 内阻异常报警                   113
    char aPrechgFailed;              // 预充异常报警                   114
    char aAlarmAvailable;            // 告警信息待获取                 115
    char aBankTemp[50];              // 预留50告警类型                 116 ~ 165

    char aChgEquState[MAX_BATT_NUM]; // 充电均衡状态                   201 ~ 800
    char aDchgEquState[MAX_BATT_NUM];// 放电均衡状态                   801 ~ 1400

    // 内部使用测点
    uchar uaBCVersMajor1;            // BC主板本号高字节
    uchar uaBCVersMajor2;            // BC主板本号低字节
    uchar uaBCVersMinor1;            // BC次板本号高字节
    uchar uaBCVersMinor2;            // BC次板本号低字节
    uchar uaBCBootVers1;             // BC Boot版本号高字节
    uchar uaBCBootVers2;             // BC Boot版本号低字节
    uchar uaBMUVers1;                // BMU版本号高字节
    uchar uaBMUVers2;                // BMU版本号低字节

    quint16 usBankStateSum;          // 各组状态汇总   0 - 无  0x0001 - 充满  0x0002 - 放空
    quint16 usIsolSwitchAggrState;   // 隔离开关汇总状态 0 - 断开  1 - 全部闭合
    quint16 usBranChgDropPowerYear;  // 支路充电降功率时间
    quint16 usBranChgDropPowerMonth;
    quint16 usBranChgDropPowerDay;
    quint16 usBranChgDropPowerHour;
    quint16 usBranChgDropPowerMin;
    quint16 usBranChgDropPowerSec;

    quint16 usBranDchgDropPowerYear; // 支路放电降功率时间
    quint16 usBranDchgDropPowerMonth;
    quint16 usBranDchgDropPowerDay;
    quint16 usBranDchgDropPowerHour;
    quint16 usBranDchgDropPowerMin;
    quint16 usBranDchgDropPowerSec;

    quint16 usBCRunMode;             // BC运行模式
    quint16 usBCConfig;              // BC配置项
    quint16 usInitState;             // 初始化状态(检查接触器粘连) 0 - 需要初始化  1 - 初始化完成
    quint16 usForbidChg;             // 禁止充电
    quint16 usForbidDchg;            // 禁止放电
    quint16 usForbidReason;          // 降功率、禁充放原因 [X-充电降功率(1:电压 2:温度) X-禁充(1:电压 2:温度) X-放电降功率(1:电压 2:温度) X-禁放(1:电压 2:温度)]  0x0100 - 禁充(充满)  0x0200 - 禁充  0x0001 - 禁放(放空)  0x0002 - 禁放
    double dblBankDchgEQAddInit;     // 禁充时的组累积放电量
    double dblBankChgEQAddInit;      // 禁放时的组累积放电量
    quint16 usBMUNum;                // BMU 数量
    float fFanStartTemp;             // 风机开启温度
    float fFanStopTemp;              // 风机停止温度
    SBMUParam BMUParam[MAX_BMU_NUM]; // BMU 参数配置
    quint16 usCellNumInPack;         // Pack中电池数
    quint16 usTempNumInPack;         // Pack中温度数
    quint16 usDiverter;              // 分流器型号
    quint16 usCanFrameNum;           // Can 帧数

    quint16 usResTestState;          // 绝缘检测状态                    0 - 初始化  1 - 正在测试  2 - 测试结束
    quint16 usInitFulfillNum;        // BC初始化完成次数
    quint32 uiBCHeartbeat;           // BC心跳
    quint32 uiLastBCHeartbeat;       // 上次BC心跳

    quint16	usLastDI1;               // 上一次 BCMU开关状态寄存器Input 1（直流接触器状态）  1--闭合， 0--断开
    quint16	usLastDI2;
    quint16	usLastDI3;
    quint16	usLastDI4;
    quint16	usLastDI5;
    quint16	usLastDI6;

    quint16 usStartYear;             // 开始充放电时间
    quint16 usStartMonth;
    quint16 usStartDay;
    quint16 usStartHour;
    quint16 usStartMin;
    quint16 usStartSec;
    quint16 usSaveYear;              // 数据保存时间
    quint16 usSaveMonth;
    quint16 usSaveDay;
    quint16 usSaveHour;
    quint16 usSaveMin;
    quint16 usSaveSec;

    quint16 usStateChangeStartYear;                 // PCS状态 变化 开始时间(AAAA的状态变化记录)
    quint16 usStateChangeStartMonth;
    quint16 usStateChangeStartDay;
    quint16 usStateChangeStartHour;
    quint16 usStateChangeStartMin;
    quint16 usStateChangeStartSec;

    quint16	usLastBankState;                        // 上一次PCS状态记录, PCS状态维持10秒才真正改变状态
    quint16 usLastBankStateYear;
    quint16 usLastBankStateMonth;
    quint16 usLastBankStateDay;
    quint16 usLastBankStateHour;
    quint16 usLastBankStateMin;
    quint16 usLastBankStateSec;

    quint16 usBCMUConnFaultStartYear;              // BC通讯故障开始时间, FaultStrategy=2 时5分钟后,PCS状态转化成 待机
    quint16 usBCMUConnFaultStartMonth;
    quint16 usBCMUConnFaultStartDay;
    quint16 usBCMUConnFaultStartHour;
    quint16 usBCMUConnFaultStartMin;
    quint16 usBCMUConnFaultStartSec;

    quint16 usBMUConnFaultStartYear;              // BMU通讯故障开始时间, FaultStrategy=2 时5分钟后,PCS状态转化成 待机
    quint16 usBMUConnFaultStartMonth;
    quint16 usBMUConnFaultStartDay;
    quint16 usBMUConnFaultStartHour;
    quint16 usBMUConnFaultStartMin;
    quint16 usBMUConnFaultStartSec;

    quint16 usBMUConnFaultNo;                    // BMU通讯故障No

    // DO口(干湿节点)
    quint16 usDry1State;         // 干接点1状态
    quint16 usDry2State;         // 干接点2状态
    quint16 usDry3State;         // 干接点3状态
    quint16 usDry4State;         // 干接点4状态
    quint16 usDry5State;         // 干接点5状态
    quint16 usDry6State;         // 干接点6状态
    quint16 usDry7State;         // 干接点7状态
    quint16 usWetState;          // 湿接点状态 - 接触器

    quint16 usDry1Ctrl;         // 干接点1控制
    quint16 usDry2Ctrl;         // 干接点2控制
    quint16 usDry3Ctrl;         // 干接点3控制
    quint16 usDry4Ctrl;         // 干接点4控制
    quint16 usDry5Ctrl;         // 干接点5控制
    quint16 usDry6Ctrl;         // 干接点6控制
    quint16 usDry7Ctrl;         // 干接点7控制
    quint16 usWetCtrl;          // 湿接点控制 - 接触器

    int iDry1CtrlNum;           // 干接点1控制次数      // -1 一直发送 0 - 不控制
    int iDry2CtrlNum;           // 干接点2控制次数
    int iDry3CtrlNum;           // 干接点3控制次数
    int iDry4CtrlNum;           // 干接点4控制次数
    int iDry5CtrlNum;           // 干接点5控制次数
    int iDry6CtrlNum;           // 干接点6控制次数
    int iDry7CtrlNum;           // 干接点7控制次数
    int iWetCtrlNum;            // 湿接点控制次数

    int iPosJCQNotCloseCount;   // 总正接触器不闭合计数(故障)
    int iNegJCQNotCloseCount;   // 总负接触器不闭合计数(故障)
    int iPreJCQNotCloseCount;   // 预充接触器不闭合计数(故障)
    int iPosJCQCtrlCount;       // 总正接触器控制计数(粘连)
    int iNegJCQCtrlCount;       // 总负接触器控制计数(粘连)
    int iPreJCQCtrlCount;       // 预充接触器控制计数(粘连)
    int iPreJCQDelayCount;      // 预充接触器延时计数（闭合延时、预充延时）
    int iPrechgTimeoutCount;    // 预充超时计数

    // 需要闭合湿接点(接触器)
    quint16 usNeedCloseJCQ;     // 1 - 需要闭合  0 - 不需要闭合
    quint16 usPreChgCtrlState;  // 预充控制状态

    // 复位命令
    quint16 usResetSOC;         // 复位SOC 重新计算SOC  1 - 需要复位

    // 设置K值
    quint16 usSetKValue;             // 设置K值        1 - 需要设置  0 - 不需要
    quint16 usBankVolKValue;         // 组端电压K值
    quint16 usBankChargeCurKValue;   // 充电电流K值
    quint16 usBankDischargeCurKValue;// 放电电流K值
    quint16 usBankVolKSet;           // 组端电压K设置值
    quint16 usBankChargeCurKSet;     // 充电电流K设置值
    quint16 usBankDischargeCurKSet;  // 放电电流K设置值

    // 参数缓存(报警参数、报警回差、保护参数、保护回差)
    SAlarmParam param;
    float fRatedVolTemp;                 // 平台电压缓存
    quint16 usDiverterTemp;              // 分流器型号缓存
    quint16 usBMUNumTemp;                // BMU 数量缓存
    SBMUParam BMUParamTemp[MAX_BMU_NUM]; // BMU 参数配置缓存

    // 通用命令缓存
    quint16 usCmdTpye;               // 返回类型 41 - 处理成功  42 - 处理失败
        // 命令类型( > 200 ) 见通用命令类型 (200 ~ 150)   xnview   赋值
    quint16 usExeResult;             // 执行结果 0  - 正在执行 1 - 成功  2 - 失败    xndacsrv 赋值
    qint16 sCheckResultNum;          // 最多监测(执行)命令次数
    float fCmdParam1;                // 命令参数1
    float fCmdParam2;                // 命令参数2
    float fCmdParam3;                // 命令参数3
    float fCmdParam4;                // 命令参数4
    float fCmdParam5;                // 命令参数5
    float fCmdParam6;                // 命令参数6
    float fCmdParam7;                // 命令参数7
    float fCmdParam8;                // 命令参数8
    float fCmdParam9;                // 命令参数9
    float fCmdParam10;               // 命令参数10
    float fCmdParam11;               // 命令参数11
    float fCmdParam12;               // 命令参数12
    float fCmdParam13;               // 命令参数13
    float fCmdParam14;               // 命令参数14
    float fCmdParam15;               // 命令参数15

    // 手动复位标志
    quint16 usNeedManualReset;  // 需要手动复位    1 - 充电过流复位 0x01     2 - 放电过流复位 0x02   4 - 组端压差过大 0x04   8 - 保护告警 0x08   0x10 - 预充失败
        //
    // 存在支路内组压差
    quint16 usConfirmYear;      // 确认时间时间
    quint16 usConfirmMonth;
    quint16 usConfirmDay;
    quint16 usConfirmHour;
    quint16 usConfirmMin;
    quint16 usConfirmSec;

    quint16 usBCMUConnFaultNum;    // BCMU 连接故障次数

    // 降功率 - 告警触发时间
    quint16 usDropPowerType;                     // 上次降功率原因 0 - 无   1 - 超30mv   2 - 电压告警超  3 - 小电流维持告警  4 - 温度告警超
    quint16 usDropPowerAlarmYear;
    quint16 usDropPowerAlarmMonth;
    quint16 usDropPowerAlarmDay;
    quint16 usDropPowerAlarmHour;
    quint16 usDropPowerAlarmMin;
    quint16 usDropPowerAlarmSec;
    float fLastBankAllowMaxChargePower;         // 电池组最大上次充电功率
    float fLastBankAllowMaxDischargePower;      // 电池组最大上次放电功率
    float fLastBankAllowMaxChargeCurrent;       // 电池组最大上次充电电流
    float fLastBankAllowMaxDischargeCurrent;    // 电池组最大上次放电电流

    // 监测数据调整步长(系数)
    float fBankVolCoe;                           // 组端电压调整步长(系数)
    float fChargeCurCoe;  				         // 充电电流调整步长(系数)
    float fDischargeCurCoe;  	                 // 放电电流调整步长(系数)
    float fEnvTempCoe;  	                     // 环境温度调整步长(系数)
    float fSglVolCoe;  	                         // 单体电压调整步长(系数)
    float fSglTempCoe;  	                     // 单体温度调整步长(系数)
    float fBankSocRefUpLmtCoe;  	             // SOC标定基准上限值调整步长(系数)
    float fBankSocRefDownLmtCoe;  	             // SOC标定基准下限值调整步长(系数)

    quint16 usWarnParamModifyCount;              // 预警参数修改计数 > 0 修改过,同步到DB = 0
    quint16 usAlarmParamModifyCount;             // 告警参数修改计数
    quint16 usProtParamModifyCount;              // 保护参数修改计数
    quint16 usWarnHCParamModifyCount;            // 预警参数修改计数 > 0 修改过,同步到DB = 0
    quint16 usAlarmHCParamModifyCount;           // 告警参数修改计数
    quint16 usProtHCParamModifyCount;            // 保护参数修改计数
    quint16 usBankTempParamModifyCount;          // 组临时参数修改计数
    quint16 usMonitorParamModifyCount;           // 监测数据调整步长修改计数
    quint16 usEMSContModifyCountPos;             // EMS 控制接触器
    quint16 usEMSContModifyCountNeg;             // EMS 控制接触器

    // SOH
    quint16 usSglVolSnapState;                   // 单体电压快照状态 0 - 上限下限都可记录  0x0001 - 已记录上限  0x0010 - 已记录下限
    float fSglVolUpSnap[MAX_BATT_NUM];           // 单体电压上限快照
    float fSglVolDownSnap[MAX_BATT_NUM];         // 单体电压下限快照

    // 单体温度数据处理
    quint16 usDtProcTempWireBreak;               // 温度采集断线
    quint16 usDtProcTempShortCircuit;            // 温度采集短路
    float fDtProcSglTemp[MAX_BATT_NUM];          // 单体温度

    // 单体电压数据处理
    float fDtProcSglVol[MAX_BATT_NUM];           // 单体电压
    quint16 usDtProcSglVolState[MAX_BATT_NUM];   // 单体电压状态   1 - 过压预警或告警  2 - 欠压预警或告警  11 - 过压保护  22 - 欠压保护

    // 温升处理
    quint16 usTempRiseConut[MAX_BATT_NUM];       // 温升时间计数
    float fTempRise[MAX_BATT_NUM];

    // 电压突变处理 检测到单体电压与平均电压突升后,延时5秒确认，比较
    quint16 usVolSudChgConut[MAX_BATT_NUM];       // 电压突变计数
    quint16 usVolDeltaIndex;                      // 5次缓存序号
    float fInitSglVolSudChg[MAX_BATT_NUM];
    float fSglVolTemp[MAX_BATT_NUM];              // 单体电压
    float fVolDelta[5][MAX_BATT_NUM];
    float fAvgVolTemp;                            // 平均电压
    float fAvgVolDelta[5];

    // 内阻异常检测
    quint16 usResAbnormalState[MAX_BATT_NUM];    // 过压 - 0x01xx  欠压 - 0xxx01 重启失效

    // 充放电电量统计
    float fChgEQForNum;                          // 充电次数的电量统计
    float fDchgEQForNum;                         // 放电次数的电量统计
    quint16 usThisChgFulfill;                    // 本次充电次数统计完成
    quint16 usThisDchgFulfill;                   // 本次放电次数统计完成

    quint16 usEMSContCtrlPos;                    // EMS接触控制  0 - BMS控制 1 - 闭合 2 - 断开
    quint16 usEMSContCtrlNeg;                    // EMS接触控制  0 - BMS控制 1 - 闭合 2 - 断开
    quint16 usBankHoldTemp[50];                  // 129 - 178

    // 标定容量计算
    float fDchgCap;
    float fChgCap;

    // BMU风机控制
    float fBMUFanStartTemp;                      // BMU中风机启动温度
    float fBMUFanStopTemp;                       // BMU中风机停止温度
    char aFanState[MAX_BMU_NUM];	             // 风机状态           0 - 未启动   1 - 启动
    char aBMUDI[MAX_BMU_NUM];	                 // BMU DI状态         0 - 断开     1 - 闭合
    char aFanFault[MAX_BMU_NUM];	             // 风机故障

    // 过流告警、保护标识
    quint16 usOverCurAlarm;                      // 过流告警标识  0 - 无   1 - 充电    2 - 放电
    quint16 usOverCurProt;                       // 过流保护标识  0 - 无   1 - 充电    2 - 放电

    // 保护需要人为确认
    quint16 usNeedManualResetForProt;

    // BC动作记录
    quint16 usActCount;                          // BC动作计数
    quint16 usActRsn;                            // BC动作原因    0 - 未知 1 - 过压 2 - 欠压 3 - 过温 4 - 过流 5 - 通讯故障
    quint16 usLastActCount;                      // BC上次动作计数
    quint16 usActAlarm;                          // BC动作告警
    quint16 usActDelayCount;                     // BC动作时间    约60s后恢复

    // BC 对时
    quint16 usLastTimeSynHour;                   // 上次对时时数
    quint16 usTimeSynCount;                      // 时间同步计数
    quint32 uiSendTimeSecs;                      // 发送对时秒数
    quint16 usSendTimeMsecs;                     // 发送对时毫秒数
    quint32 uiReceTimeSecs;                      // 接受对时秒数
    quint16 usReceTimeMsecs;                     // 接受对时毫秒数
};

#endif //BATT_BANK_H
